CVE-2012-0003漏洞分析
本文为看雪论坛优秀文章
看雪论坛作者ID:21Gun5
一、漏洞描述
二、测试环境
三、漏洞复现
四、准备工作
4.1 提取样本
4.2 MIDI格式
4.3 堆调试技巧
五、漏洞成因
六、漏洞利用
七、参考文献
4.1 提取样本
>>>> 4.2 MIDI格式
4.2 MIDI格式
>>>> 4.3 堆调试技巧
4.3 堆调试技巧
htc:堆尾检查,在堆块末尾附加额外的标记信息(通常为 8 字节),用于检査堆块是否发生溢出。
hfc:堆释放检查,在释放堆块时对堆进行各种检査,防止多次释放同一个堆块。
hpc:堆参数检査,对传递给堆管理的参数进行更多的检查。
ust:用户态栈回湖,即将每次调用堆函数的函数调用信息记录到一个数据库中。
htg:堆标志,为堆块增加附加标记,以记录堆块的使用情况或其他信息。
hvc:调用时验证,即每次调用堆函数时都对整个堆进行验证和检査
hpa:启用页堆,在堆块后增加专门用于检测溢出的栅栏页,若发生堆溢出触及栅栏页便会立刻触发异常。
在每个堆块的尾部添加 8 字节内容,若该数据被破坏就说明可能存在堆溢出。
要检测尾部数据是否被破坏,还需要开启堆参数检查hpc 或堆释放检查hfe
用调试器直接打开目标进程,而非附加方式(附加方式无法在堆尾添加额外信息,也就无法进行堆尾检查)
开启堆尾检查和堆参数检査:!gflag +htc +hpc
调试漏洞时,需要定位到导致漏洞的代码
堆尾检査方式主要是堆被破坏后的场景,不利于定位导致漏洞的代码。
开启页堆机制后,堆管理器会在堆块中增加不可访问的栅栏页,当溢出覆盖到栅栏页时就立即触发异常
参数a1=v1不变、v2不变
v9递增,增到0x44重新开始
v11=v13
v21等于v11/v13最低位
HeapAlloc函数申请0x400字节的堆空间,将堆基址赋值给esi
程序在处理”打开音符“事件时,计算得到偏移0x419
偏移0x419 > 堆空间大小0x400,最终导致堆块的越界访问,产生漏洞
创建一个 select 元素,并设置 56 个属性:只有 w0 为 String 类型,其余为 Object 类型;
创建一个1000大小的数组 clones
调用feng_shui函数:cloneNode 循环复制selob到数组 clones 中、间隔地释放 clones 数组中的元素
调用trigger函数
遍历数组元素,若其属性不是String(即Object),则执行clones[k].w0('come on!');
此语句会调用 CAttrValue::GetIntoVariant 函数
看雪ID:21Gun5
https://bbs.pediy.com/user-868592.htm
推荐文章++++
* 实战栈溢出漏洞
好书推荐